gdk/surface: Try to reschedule pending phase until dispatched
authorJonas Ådahl <jadahl@gmail.com>
Wed, 2 Dec 2020 08:39:48 +0000 (09:39 +0100)
committerJonas Ådahl <jadahl@gmail.com>
Mon, 7 Dec 2020 08:46:39 +0000 (09:46 +0100)
If a surface scheduled a relayout, got frozen, and a layout phase
happened, then got unfrozen, it wouldn't see it's layout being
requested; avoid this race by remembering the pending phases until they
actually happened.

gdk/gdksurface.c

index a8f93170ecfc1cf99602fc06519ee75d656d7232..d0cdcc33f224de59a38d307dc38d42ee03fc7ebf 100644 (file)
@@ -1368,6 +1368,8 @@ gdk_surface_layout_on_clock (GdkFrameClock *clock,
   if (surface->update_freeze_count)
     return;
 
+  surface->pending_phases &= ~GDK_FRAME_CLOCK_PHASE_LAYOUT;
+
   class = GDK_SURFACE_GET_CLASS (surface);
   if (class->compute_size)
     class->compute_size (surface);
@@ -1420,6 +1422,7 @@ gdk_surface_paint_on_clock (GdkFrameClock *clock,
        * do the update later when idle instead. */
       !surface->in_update)
     {
+      surface->pending_phases &= ~GDK_FRAME_CLOCK_PHASE_PAINT;
       gdk_surface_process_updates_internal (surface);
       gdk_surface_remove_update_surface (surface);
     }
@@ -1602,10 +1605,7 @@ gdk_surface_thaw_updates (GdkSurface *surface)
       _gdk_frame_clock_inhibit_freeze (frame_clock);
 
       if (surface->pending_phases)
-        {
-          gdk_frame_clock_request_phase (frame_clock, surface->pending_phases);
-          surface->pending_phases = 0;
-        }
+        gdk_frame_clock_request_phase (frame_clock, surface->pending_phases);
     }
 }